//
// Created by dragon on 23-8-12.
//

#include <font/font.h>
#include <draw.h>

// static char __sys_vide_buf[0x300000] = {0x0};

// static void clear_screen() {
//     for (u32_t i = 0; i < __msg.width * __msg.height; i++) {
//         __msg.vitrual_addr[i] = COLOR_BLACK;
//     }
// }

// void showc(u64_t fb, u32_t pitch, u32_t bpp, u32_t x, u32_t y, u32_t fg, u32_t bg, u8_t c) {
void showc(message_t *vbe, u8_t c)
{
    u32_t *addr;
    i32_t i, j;
    const u8_t *fontp = AsciiFont[c];

    for (i = 0; i < 16; i++)
    {
        addr = (u32_t *)(vbe->addr + (vbe->y * 16 + i) * vbe->pitch + vbe->x * 8 * vbe->bpp);
        /* code */
        for (j = 0; j < 8; j++)
        {
            if (*fontp & (0x80 >> j))
            {
                *addr = vbe->fg;
            }
            else
            {
                *addr = vbe->bg;
            }
            addr++;
        }
        fontp++;
    }
}
#if 0
static inline void print_someone(u8_t c) {
    for (int j = 0; j < __msg.y_char; ++j) {
        for (int i = 0; i < __msg.w_char; ++i) {
            if ((ascii[c][j] >> (7 - i)) & 0x01) {
                *(__msg.vitrual_addr + (__msg.y_pos + j) * __msg.width + __msg.x_pos + i) = __msg.fg_color;
            } else {
                *(__msg.vitrual_addr + (__msg.y_pos + j) * __msg.width + __msg.x_pos + i) = __msg.bg_color;
            }
        }
    }
}

static inline void print_common(u8_t c) {
    print_someone(c);
    __msg.x_pos += __msg.w_char;
    if (__msg.x_pos >= __msg.width) {
        __msg.x_pos = 0;
        __msg.y_pos += __msg.y_char;
        if (__msg.y_pos >= __msg.height) {
            __msg.y_pos = 0; // 此时需要清屏
            clear_screen();
        }
    }
}
int draw_char(u8_t c) {
    int tab_size;

    switch (c) {
    case '\b':
        if (__msg.x_pos < __msg.w_char) {
            __msg.x_pos = 0;
            if (__msg.y_pos < __msg.y_char) {
                __msg.y_pos -= __msg.y_char;
            }
        } else {
            __msg.x_pos -= __msg.w_char;
        }
        print_someone(0x20); // 打印空格覆盖原字符
        break;
    case '\t':
        tab_size = __msg.width - __msg.x_pos; // 8个像素一个字符宽
        if ((tab_size == 0) || ((tab_size / 8) > 4)) {
            tab_size = 4;
        } else {
            tab_size /= 8;
        }

        for (u32_t i = 0; i < tab_size; i++) {
            print_common(' ');
        }

        break;
    case '\r':
        __msg.x_pos = 0;
        break;
    case '\n':
        __msg.x_pos = 0;
        __msg.y_pos += __msg.y_char;
        if (__msg.y_pos >= __msg.height) {
            __msg.y_pos = 0; // 此时需要清屏
            clear_screen();
        }
        break;
    default:
        print_common(c);
        break;
    }

    return 0;
}
#endif